// 实例属性/方法
// 原型属性/方法
// 静态属性/方法

// 继承

function Person(name, age) {
  // this => 就是实例
  // !#1 实例属性/方法：挂载到实例上的就是实例属性/方法
  // name、age
  this.name = name
  this.age = age

  // 实例方法，一般方法不会往这儿挂，因为往这儿挂的话，多个实例的方法 show 发现不相等，内存浪费
  // this.show = function () {}
}
// 方法一般挂载到原型
// !#2 原型属性/方法：挂载到原型上的
Person.prototype.color = 'red'
Person.prototype.show = function () {
  console.log('~~~~')
}

// !#3 静态属性/方法：直接挂载到构造函数上的属性或方法，只能通过构造函数本身访问，实例访问不到
Person.version = 888
Person.css = function () {}

/* const p = new Person('刘德华', 50)
console.log(p.color)
p.show()
console.log(p.css, Person.version) */

function Star(name, age) {
  // 构造函数继承 => 继承是属性
  Person.call(this, name, age)
}

// 原型继承 => 继承的父类的原型上的方法
Star.prototype = new Person()
Star.prototype.construcor = Star

// 组合继承 = 构造函数继承 + 原型继承
const zxy = new Star('张学友', 19)
zxy.show()
